package com.jsz.peini.redis.util;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.jsz.peini.bean.task.TaskInfo;
import com.jsz.peini.redis.base.RedisConstants;
import com.jsz.peini.redis.base.RedisUtil;
import com.jsz.peini.redis.base.SerializeUtil;

/**
 * @author Han Guohong
 * @version 2017-3-9 下午3:25:52
 * 任务缓存处理类
 */
public class TaskRedisUtil {

	/**
	 * 将任务信息写入缓存
	 * @author Han Guohong
	 * @param taskInfo
	 */
	public static void addTaskToRedis(LinkedHashMap<String, Object> task){
		HashMap<byte[], byte[]> taskMap = new HashMap<byte[], byte[]>();
		taskMap.put(task.get("id").toString().getBytes(), SerializeUtil.serialize(task));
		RedisUtil.hmset(RedisConstants.TASK_INFO_MAP.getBytes(), taskMap);
	}
	
	/**
	 * 查询任务在redis中是否存在
	 * @author Han Guohong
	 * @param taskId
	 * @return
	 */
	public static boolean taskExist(String taskId){
		return RedisUtil.hexist(RedisConstants.TASK_INFO_MAP.getBytes(), taskId.getBytes());
	}
	
	/**
	 * 从缓存中移除任务信息
	 * @author Han Guohong
	 * @param task
	 */
	public static void delTaskInfo(String taskId){
		RedisUtil.hdel(RedisConstants.TASK_INFO_MAP.getBytes(), taskId.getBytes());
	}
	
	/**
	 * 从缓存中读取所有任务
	 * @author Han Guohong
	 * @return
	 */
	public static List<LinkedHashMap<String, Object>> getAll(){
		List<LinkedHashMap<String, Object>> list = new ArrayList<LinkedHashMap<String,Object>>();
		Map<byte[],byte[]> map = RedisUtil.hgetAll(RedisConstants.TASK_INFO_MAP.getBytes());
		Set<byte[]> keySet = map.keySet();
		for (byte[] bs : keySet) {
			LinkedHashMap<String, Object> taskMap = (LinkedHashMap<String, Object>)SerializeUtil.unserialize(map.get(bs));
			
			//从缓存中去掉已经删除的任务
			if(taskMap.get("isDelete").equals("1")){
				RedisUtil.hdel(RedisConstants.TASK_INFO_MAP.getBytes(), taskMap.get("id").toString().getBytes());
				continue;
			}
			
			//从缓存中删除过期的任务
			Date taskAppintedTime = (Date)taskMap.get("taskAppintedTime");
			if(taskAppintedTime.before(new Date())){
				RedisUtil.hdel(RedisConstants.TASK_INFO_MAP.getBytes(), taskMap.get("id").toString().getBytes());
				continue;
			}
			
			list.add(taskMap);
		}
		return list;
	}
}
